#pragma once
#include "Defines.h"
#include "Damage.h"

using namespace irr;
using namespace irr::scene;

class Entity : public ISceneNodeAnimator
{
public:
	// esta variable tambien se puede usar para loading
	static bool game_paused;

	IAnimatedMeshSceneNode * mesh;
	//ISceneNode * node;
	s32 lastTime;

	// Energia remanente
	int hp;

	// Velocidad de rotacion(angular)? Puede ser?
	core::vector3df angSpeed, 
		// Velocidad de traslacion
		speed,
		// Posicion on the map
		position,
		// Direccion en la que avanza
		rotation,
		// Direccion en la que mira...deberian ser capaces de hacer STRAFE (seteando dos acciones onda: ACCION1 | ACCION2)
		aiminDirection;

	/// Estas son las variables de colision....tener en cuenta que traslacion y dimension de la unidad esta 
	// hardcodeado en el chequeo de colision.
	bool Falling;
	f32 FallStartTime, LastTime;
	core::vector3df LastPosition;

	void animateNode (ISceneNode * node, u32 currenTime)
	{
		if (node)
		{
			static core::vector3df grav(0, SPEED_GRAVITY, 0);
			// no hay animacion hasta que el nivel no salga de la pausa
			if ( game_paused ) return;

			// delta time interval
			s32 dt = currenTime - lastTime;
			lastTime = currenTime;
			if (dt < 1 ) dt = 1;
			//cout << "position:"<< position.X << ", "<< position.Y << ", " << position.Z << ')' << endl;
			position = node->getPosition();
			speed += grav * ((float) dt);
			position += speed * ((float) dt);
			//cout << "position:"<< position.X << ", "<< position.Y << ", " << position.Z << ')' << endl;

			// update position and animation and rotation and speed
			Update( (float) dt );

			// Chequeo de colision...y correccion de posicion de acuerdo a la colision contra el mapa.
			if (checkCollition(node, (f32) currenTime)) onCollide();

			node->setPosition(position);
			node->setRotation(rotation);
		}
	}

	float radiusxz;
	float height;
	int id;
	int type;
	bool isVisible;
	bool isEnabled;
	bool isAlive;


	virtual void Update(float delta_time) = 0;

	virtual void onCollide(Entity* e);

	virtual void onCollide() = 0;

	virtual void Destroy();

	core::vector3df getCenter()
	{
		core::aabbox3d<f32> box = mesh->getBoundingBox();
		return box.getCenter();
	}

	Entity();
	~Entity(void);

private:
	bool checkCollition(ISceneNode * node, f32 timeMs);
};
